package org.example2;

import java.io.*;
import java.util.zip.*;

public class ZipFolderByChatgpt {

    /**
     * 将指定的文件夹压缩成ZIP文件
     * @param sourceFolder 要压缩的文件夹路径
     * @param zipFilePath 压缩后的ZIP文件路径
     * @throws IOException 如果发生I/O错误
     */
    public static void zipFolder(String sourceFolder, String zipFilePath) throws IOException {
        // 创建输出流和Zip输出流
        FileOutputStream fos = new FileOutputStream(zipFilePath);
        ZipOutputStream zos = new ZipOutputStream(fos);

        // 获取源文件夹对象
        File srcFile = new File(sourceFolder);
        if (!srcFile.isDirectory()) {
            throw new IllegalArgumentException("源路径必须是一个文件夹");
        }
        // 开始递归压缩文件夹
        zipDirectory(srcFile, srcFile.getName(), zos);

        // 关闭流
        zos.close();
        fos.close();
    }

    /**
     * 递归地将目录下的文件和子目录添加到ZipOutputStream中
     * @param folder 当前处理的文件夹
     * @param parentFolder 当前文件夹在zip包中的路径前缀
     * @param zos Zip输出流
     * @throws IOException 如果发生I/O错误
     */
    private static void zipDirectory(File folder, String parentFolder, ZipOutputStream zos) throws IOException {
        System.out.println("folder-----：" + folder);
        System.out.println("parentFolder-----：" + parentFolder);
        // 遍历当前目录下所有文件
        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                // 如果是目录，递归调用，并在路径中添加目录名
                zipDirectory(file, parentFolder + "/" + file.getName(), zos);
            } else {
                // 如果是文件，则将文件添加到zip包中
                FileInputStream fis = new FileInputStream(file);
                // 构造zip条目，保持原有的目录结构
                ZipEntry zipEntry = new ZipEntry(parentFolder + "/" + file.getName());
                zos.putNextEntry(zipEntry);

                // 读取文件内容并写入ZipOutputStream
                byte[] buffer = new byte[1024];
                int length;
                while ((length = fis.read(buffer)) >= 0) {
                    zos.write(buffer, 0, length);
                }
                zos.closeEntry();
                fis.close();
            }
        }
    }

    // 主函数示例
    public static void main(String[] args) {
        // 源文件夹路径
        String sourceFolder = "E:\\API\\Java";
        // 生成的ZIP文件路径
        String zipFilePath = "F:\\mylib\\fileapi.zip";

        try {
            zipFolder(sourceFolder, zipFilePath);
            System.out.println("文件夹压缩成功！");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
